package com.ihr360.authority.sharing.service;

import com.ihr360.authority.sharing.model.dto.AuthUserResource;
import com.ihr360.authority.sharing.model.vo.SimpleAuthUserResourceVo;
import com.ihr360.commons.data.util.Pair;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;

import java.util.List;
import java.util.Map;

public interface AuthUserResourceService {
    /**
     * 获取当前用户对某个类型资源的访问权限
     *
     * @param bizClass
     * @return 资源和权限的映射关系
     */
    Pair<Map<Object, Integer>, Map<Object, Integer>> queryUserResourcesPrivilege(Class bizClass, Class keyClass);

    /**
     * 获取当前用户对某个类型资源的访问权限
     *
     * @param bizClass
     * @return 资源和权限的映射关系
     */
    Map<Long, Integer> queryUserResourcesPrivilegeWithLongId(Class bizClass);

    /**
     * 获取当前用户的对某个资源的访问权限
     *
     * @param bizModel
     * @param resourceId
     * @return 访问权限-资源公开权限
     */
    Pair<Integer, Integer> queryUserResourcePrivilege(Class bizModel, String resourceId);

    /**
     * 获取当前用户的有权限操作的资源列表
     *
     * @param bizClass
     * @return
     */
    List<SimpleAuthUserResourceVo> queryUserResources(
            Class bizClass);


    /**
     * 获取当前用户的有权限操作的资源列表
     *
     * @param bizClass
     * @param pageable
     * @return
     */
    Page<AuthUserResource> getUserResources(
            Class bizClass, Pageable pageable);

    /**
     * 获取某个资源的可操作人员列表
     *
     * @param bizModel
     * @param resourceId
     * @param pageable
     * @return
     */
    Page<SimpleAuthUserResourceVo> getResourcesUsers(
            String bizModel,
            String resourceId, Pageable pageable);

    /**
     * 获取某个资源的可操作人员列表
     *
     * @param bizModel
     * @param resourceId
     * @return
     */
    List<SimpleAuthUserResourceVo> getResourceUsers(
            String bizModel,
            String resourceId);

    /**
     * 获取某个资源的可操作人员列表
     *
     * @param bizModel
     * @param resourceId
     * @return
     */
    List<SimpleAuthUserResourceVo> getResourceUsers(
            String companyId,
            String bizModel,
            String resourceId);

    /**
     * 查询当前用户是否拥有某个权限的访问
     *
     * @param bizClass
     * @param resource
     * @return
     */
    int queryUserResourceCount(
            Class bizClass,
            String resource);

    /**
     * 获取某个人的某个模块下可操作的人员列表
     *
     * @param companyId
     * @param bizClass  模块标识
     * @param userId
     * @return
     */
    List<SimpleAuthUserResourceVo> queryUserResources(
            String companyId,
            Class bizClass,
            String userId);


    /**
     * 获取某个人在某个模块下的可操作人员列表
     *
     * @param companyId
     * @param bizClass
     * @param userId
     * @param pageable
     * @return
     */
    Page<AuthUserResource> getUserResources(
            String companyId,
            Class bizClass,
            String userId, Pageable pageable);

    /**
     * 获取某个资源的可操作人员列表
     *
     * @param companyId
     * @param bizModel
     * @param resourceId
     * @param pageable
     * @return
     */
    Page<SimpleAuthUserResourceVo> getResourcesUsers(
            String companyId,
            String bizModel,
            String resourceId, Pageable pageable);

    /**
     * 查询某个用户是否拥有某个权限的访问
     *
     * @param companyId
     * @param bizClass
     * @param userId
     * @param resource
     * @return
     */
    int queryUserResourceCount(
            String companyId,
            Class bizClass,
            String userId,
            String resource);

    /**
     * 更新（）
     */
    void update(String resourceId, List<SimpleAuthUserResourceVo> updatedVos, List<Long> deletedIds);

    boolean checkOwner(String companyId,
                       String bizModel,
                       String userId,
                       String resourceId);

    AuthUserResource takeOne(String companyId,
                             String bizModel,
                             String userId,
                             String resourceId);

    /**
     * 手动增加模块资源可读权限（staff端审批使用）
     * */
    void addUserResource(String companyId,String bizModel,List<String> userIdList,String resourceId);

    /**
     * 复制某一个资源的分享权限到新的资源...
     *
     * @param resourceSourceId
     * @param resourceSourceClassSimpleName
     * @param resourceTargetIdList
     * @param resourceTargeClassSimpleName
     * @return
     */
    List<AuthUserResource> copyResourceAuthToNewResource(String resourceSourceId, String resourceSourceClassSimpleName,
                                                                List<String> resourceTargetIdList, String resourceTargeClassSimpleName);
}